package com.zj.study.aopdemo.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author 赵赳
 * @since 2021/9/1 14:28
 */
@Slf4j
@Aspect
@Component
public class AopConfig {

  /* 切入点表达式 或 注解方式 */
  @Pointcut("execution(public * com.zj.study.aopdemo.controller.*.*(..)) || @annotation(com.zj.study.aopdemo.annotation.Log)")
  public void BrokerAspect() {
  }

  @Around(value = "BrokerAspect()")
  public Object doAround(ProceedingJoinPoint joinPoint) {
    Object proceed = null;
    try {
      log.info("doAround执行之前。。。。");
      proceed = joinPoint.proceed();
      log.info("doAround执行之后。。。。,返回：{}", proceed);
    } catch (Throwable throwable) {
      log.info("doAround执行异常。。。。");
      throwable.printStackTrace();
    }
    return proceed;
  }


  /**
   * 方法执行之前执行
   */
  @Before(value = "BrokerAspect()")
  public void doBefore() {
    log.info("Before: 在执行方法之前。。。");
  }


  /**
   * 方法执行之后执行（返回通知和异常通知的异常）
   */
  @After(value = "BrokerAspect()")
  public void doAfter() {
    log.info("After: 在执行方法之后。。。");
  }

  /**
   * 在连接点执行之后执行的通知（返回通知）
   */
  @AfterReturning(value = "BrokerAspect()")
  public void doAfterReturning() {
    log.info("AfterReturning: 在方法执行之后,返回通知");
  }


  /**
   * 在连接点执行之后执行的通知（异常通知）
   */
  @AfterThrowing(value = "BrokerAspect()")
  public void doAfterThrowing() {
    log.info("AfterThrowing: 异常通知");
  }


}
